home *** CD-ROM | disk | FTP | other *** search
/ PC User 2003 May / Disc 2 / PCU0503CD2.iso / Crystal / 3rdparty / JavaVM / Plug-in / jplugin.exe / rt.jar / sun / tools / jar / SignatureFile.class (.txt) < prev   
Encoding:
Java Class File  |  1998-04-16  |  5.6 KB  |  224 lines

  1. package sun.tools.jar;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.io.PrintStream;
  9. import java.security.MessageDigest;
  10. import java.security.NoSuchAlgorithmException;
  11. import java.util.Enumeration;
  12. import java.util.Hashtable;
  13. import java.util.Vector;
  14. import sun.misc.BASE64Encoder;
  15. import sun.misc.CharacterEncoder;
  16. import sun.net.www.MessageHeader;
  17. import sun.security.pkcs.PKCS7;
  18. import sun.security.pkcs.SignerInfo;
  19.  
  20. public class SignatureFile {
  21.    static final boolean debug = false;
  22.    private Vector entries;
  23.    static final String[] hashes = new String[]{"SHA", "MD5"};
  24.    private Manifest manifest;
  25.    private String rawName;
  26.    private PKCS7 signatureBlock;
  27.    private Hashtable digests;
  28.  
  29.    static final void debug(String var0) {
  30.    }
  31.  
  32.    private SignatureFile(String var1) throws JarException {
  33.       this.entries = new Vector();
  34.       this.digests = new Hashtable();
  35.       this.entries = new Vector();
  36.       if (var1 != null) {
  37.          if (var1.length() > 8 || var1.indexOf(46) != -1) {
  38.             throw new JarException("invalid file name");
  39.          }
  40.  
  41.          this.rawName = var1.toUpperCase();
  42.       }
  43.  
  44.    }
  45.  
  46.    private SignatureFile(String var1, boolean var2) throws JarException {
  47.       this(var1);
  48.       if (var2) {
  49.          MessageHeader var3 = new MessageHeader();
  50.          var3.set("Signature-Version", "1.0");
  51.          this.entries.addElement(var3);
  52.       }
  53.  
  54.    }
  55.  
  56.    public SignatureFile(Manifest var1, String var2) throws JarException {
  57.       this(var2, true);
  58.       this.manifest = var1;
  59.       Enumeration var3 = var1.entries();
  60.  
  61.       while(var3.hasMoreElements()) {
  62.          MessageHeader var4 = (MessageHeader)var3.nextElement();
  63.          String var5 = var4.findValue("Name");
  64.          if (var5 != null) {
  65.             this.add(var5);
  66.          }
  67.       }
  68.  
  69.    }
  70.  
  71.    public SignatureFile(Manifest var1, String[] var2, String var3) throws JarException {
  72.       this(var3, true);
  73.       this.manifest = var1;
  74.       this.add(var2);
  75.    }
  76.  
  77.    public SignatureFile(InputStream var1, String var2) throws IOException {
  78.       this(var2);
  79.  
  80.       while(var1.available() > 0) {
  81.          MessageHeader var3 = new MessageHeader(var1);
  82.          this.entries.addElement(var3);
  83.       }
  84.  
  85.    }
  86.  
  87.    public SignatureFile(InputStream var1) throws IOException {
  88.       this((InputStream)var1, (String)null);
  89.    }
  90.  
  91.    public SignatureFile(byte[] var1) throws IOException {
  92.       this((InputStream)(new ByteArrayInputStream(var1)));
  93.    }
  94.  
  95.    public String getName() {
  96.       return "META-INF/" + this.rawName + ".SF";
  97.    }
  98.  
  99.    public String getBlockName() {
  100.       String var1 = "DSA";
  101.       if (this.signatureBlock != null) {
  102.          SignerInfo var2 = this.signatureBlock.getSignerInfos()[0];
  103.          var1 = var2.getDigestEncryptionAlgorithmId().getName();
  104.          var1 = var1.substring(var1.length() - 3);
  105.       }
  106.  
  107.       return "META-INF/" + this.rawName + "." + var1;
  108.    }
  109.  
  110.    public PKCS7 getBlock() {
  111.       return this.signatureBlock;
  112.    }
  113.  
  114.    public void setBlock(PKCS7 var1) {
  115.       this.signatureBlock = var1;
  116.    }
  117.  
  118.    public void add(String[] var1) throws JarException {
  119.       for(int var2 = 0; var2 < var1.length; ++var2) {
  120.          this.add(var1[var2]);
  121.       }
  122.  
  123.    }
  124.  
  125.    public void add(String var1) throws JarException {
  126.       MessageHeader var2 = this.manifest.getEntry(var1);
  127.       if (var2 == null) {
  128.          throw new JarException("entry " + var1 + " not in manifest");
  129.       } else {
  130.          MessageHeader var3;
  131.          try {
  132.             var3 = this.computeEntry(var2);
  133.          } catch (IOException var5) {
  134.             throw new JarException(((Throwable)var5).getMessage());
  135.          }
  136.  
  137.          this.entries.addElement(var3);
  138.       }
  139.    }
  140.  
  141.    public MessageHeader getEntry(String var1) {
  142.       Enumeration var2 = this.entries();
  143.  
  144.       while(var2.hasMoreElements()) {
  145.          MessageHeader var3 = (MessageHeader)var2.nextElement();
  146.          if (var1.equals(var3.findValue("Name"))) {
  147.             return var3;
  148.          }
  149.       }
  150.  
  151.       return null;
  152.    }
  153.  
  154.    public MessageHeader entryAt(int var1) {
  155.       return (MessageHeader)this.entries.elementAt(var1);
  156.    }
  157.  
  158.    public Enumeration entries() {
  159.       return this.entries.elements();
  160.    }
  161.  
  162.    private MessageHeader computeEntry(MessageHeader var1) throws IOException {
  163.       MessageHeader var2 = new MessageHeader();
  164.       String var3 = var1.findValue("Name");
  165.       if (var3 == null) {
  166.          return null;
  167.       } else {
  168.          var2.set("Name", var3);
  169.          BASE64Encoder var4 = new BASE64Encoder();
  170.  
  171.          try {
  172.             String var5 = "";
  173.  
  174.             for(int var6 = 0; var6 < hashes.length; ++var6) {
  175.                var5 = var5 + hashes[var6] + " ";
  176.             }
  177.  
  178.             var2.set("Digest-Algorithms", var5);
  179.  
  180.             for(int var7 = 0; var7 < hashes.length; ++var7) {
  181.                MessageDigest var8 = this.getDigest(hashes[var7]);
  182.                ByteArrayOutputStream var9 = new ByteArrayOutputStream();
  183.                PrintStream var10 = new PrintStream(var9);
  184.                var1.print(var10);
  185.                byte[] var11 = var9.toByteArray();
  186.                byte[] var12 = var8.digest(var11);
  187.                var2.set(hashes[var7] + "-Digest", ((CharacterEncoder)var4).encode(var12));
  188.             }
  189.  
  190.             return var2;
  191.          } catch (NoSuchAlgorithmException var13) {
  192.             throw new JarException(((Throwable)var13).getMessage());
  193.          }
  194.       }
  195.    }
  196.  
  197.    private MessageDigest getDigest(String var1) throws NoSuchAlgorithmException {
  198.       MessageDigest var2 = (MessageDigest)this.digests.get(var1);
  199.       if (var2 == null) {
  200.          var2 = MessageDigest.getInstance(var1);
  201.          this.digests.put(var1, var2);
  202.       }
  203.  
  204.       var2.reset();
  205.       return var2;
  206.    }
  207.  
  208.    public void stream(OutputStream var1) throws IOException {
  209.       MessageHeader var2 = (MessageHeader)this.entries.elementAt(0);
  210.       if (var2.findValue("Signature-Version") == null) {
  211.          throw new JarException("Signature file requires Signature-Version: 1.0 in 1st header");
  212.       } else {
  213.          PrintStream var3 = new PrintStream(var1);
  214.          var2.print(var3);
  215.  
  216.          for(int var4 = 1; var4 < this.entries.size(); ++var4) {
  217.             MessageHeader var5 = (MessageHeader)this.entries.elementAt(var4);
  218.             var5.print(var3);
  219.          }
  220.  
  221.       }
  222.    }
  223. }
  224.